#include "indice_arbol.h"

IndiceArbol::IndiceArbol(std::string& nombre, unsigned int tam_bloque,TiposArchivo tipo_indice):Indice(nombre, tam_bloque){
	
	if(tipo_indice == INDICE_B)
		arbol = new ArbolB(nombre,tam_bloque); 
	if(tipo_indice == INDICE_B_MAS)
		arbol = new ArbolBMas(nombre,tam_bloque);
	tipo = tipo_indice;
	TipoInt * tipo_base = new TipoInt();
	arbol->set_tipo_base(*tipo_base);
	arbol->agregar_observador(Buffer::get_instance());
	delete tipo_base;
}
		
IndiceArbol::~IndiceArbol(){
	if (arbol != NULL)
		delete arbol;
	arbol = NULL;
}
		
void IndiceArbol::crear() throw(ExcepCreandoArch, ExcepSintaxisParser, ExcepBloqueTam){
	arbol->crear();
}
		
void IndiceArbol::abrir() throw(ExcepAbriendoArch){
	arbol->abrir();
}
		
void IndiceArbol::cerrar(){
	arbol->cerrar();
}
 		
void IndiceArbol::eliminar(){
	arbol->eliminar();
}

TiposArchivo IndiceArbol::get_tipo_archivo(){
	return NINGUNO;	
}
		
unsigned int IndiceArbol::get_espacio_libre()  throw(ExcepArchCerrado, ExcepLeerBloque){
	return arbol->get_espacio_libre();	
}
 		
void IndiceArbol::ingresar(TipoDato* clave, int num_bloque) 
				throw(ExcepArchCerrado,ExcepRegExistente, ExcepBloqueTam){
	arbol->ingresar(clave->clonar(),new TipoInt(num_bloque));
}

void IndiceArbol::quitar(TipoDato* clave) throw(ExcepArchCerrado){
	arbol->quitar(clave);	
}
		
unsigned int IndiceArbol::consultar(TipoDato* clave) throw(ExcepArchCerrado,ExcepLeerBloque){
	TipoInt* res;
	res = arbol->consultar(clave);
	int result = Indice::VACIO;
	if(res != NULL){
		result = res->get_valor(); 
		delete res;
	}
	return result;	
}
 
void IndiceArbol::actualizar(TipoDato* clave, int bloque_nuevo) throw(ExcepArchCerrado,ExcepRegInexistente, ExcepBloqueTam){
//NO HACE NADA POR AHORA
}

int IndiceArbol::consultar_ubicacion (TipoDato* clave){
	int retorno = -1;
	if (tipo == INDICE_B_MAS) {
		ArbolBMas* aux = (ArbolBMas*) this->arbol;
		//TipoInt* n_bloque = aux->consultar_menor(clave);
		TipoInt* n_bloque = aux->consultar(clave);
		if (n_bloque != NULL) {
			retorno = n_bloque->get_valor();
			delete (n_bloque);	
		}
	}
	return retorno;
}

TipoInt* IndiceArbol::get_siguiente(){
	TipoInt* retorno = NULL;
	if (tipo == INDICE_B_MAS) {
		ArbolBMas* aux = (ArbolBMas*) this->arbol;
		retorno = aux->get_siguiente();
	}
	return retorno;
}

unsigned int IndiceArbol::get_cant_regs(){
	return arbol->get_cant_regs();
}

long IndiceArbol::get_tam() throw(ExcepArchCerrado){
	return arbol->get_tam();
}
